package j03zuoye;
/*
抽象饲养动物
在上面的模块里, 在com.hualan.animal包里创建RaiseTest类, 在类的main方法中测试下面编写的类(创建对象, 访问方法):

   (1) 定义**抽象类**Animal, 包含姓名name, 年龄age属性, 包含**抽象方法**eat和sleep

   > eat和sleep定义成抽象方法的原因是为了让子类实现这2个方法.

   (2) 定义猫类Cat, 继承于Animal, 实现父类的eat和sleep方法, 提供一个抓老鼠方法public void catchMouse()

   (3) 定义狗类Dog, 继承于Animal, 实现父类的eat和sleep方法, 提供一个看门方法public void guardHouse()

(4)定义一个Person类, 包含姓名name属性, 提供一个public void raiseAnimal(Animal animal)方法, raiseAnimal方法中执行animal的eat方法.
 */
abstract class Animal{
    String name;
    int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    abstract void eat();
    abstract void sleep();
}
class Cat extends Animal{
    public Cat() {
    }

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    void eat() {
        System.out.println(name+"吃鱼");
    }

    @Override
    void sleep() {
        System.out.println(name+"睡觉乌鲁鲁");
    }

    public void catchMouse(){
        System.out.println(name+"抓老鼠");
    }
}
class Dog extends Animal{
    public Dog() {
    }

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    void eat() {
        System.out.println(name+"吃骨头");
    }

    @Override
    void sleep() {
        System.out.println(name+"睡觉很警觉");
    }
    public void guardHouse(){
        System.out.println(name+"看门");
    }
}
class Person{
    String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public void raise(Animal animal){
        System.out.println(name+"打开宠物窝门");
        animal.eat();
    }
}
public class Z2Animal {
    public static void main(String[] args) {
        Person daiyu = new Person("黛玉");
        daiyu.raise(new Cat("加菲猫",2));
        daiyu.raise(new Dog("泰迪",3));
    }
}
